package com.alcloud.springplus.base;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.Map;
import java.util.Optional;

/**
 * @className: GenericService
 * @description: 通用Service, 提供常规方法
 * @author: AllG
 * @createDate: 2018/12/4 11:54
 * @updateRemark: 更新说明
 */
public interface GenericService<T,ID> {

    /**
     * @method  save
     * @description 保存兼并修改对象
     * @date: 2018/12/7 8:58
     * @author: AllG
     * @param entity
     * @return S
     */
    <S extends T> S save(S entity);

    /**
     * @method  saveAll
     * @description 多个对象保存
     * @date: 2018/12/7 8:58
     * @author: AllG
     * @param entities
     * @return java.lang.Iterable<S>
     */
    <S extends T> Iterable<S> saveAll(Iterable<S> entities);

    /**
     * @method  findById
     * @description 通过ID查询
     * @date: 2018/12/7 8:58
     * @author: AllG
     * @param id
     * @return java.util.Optional<T>
     */
    Optional<T> findById(ID id);

    /**
     * @method  existsById
     * @description 通过Id判断是否存在
     * @date: 2018/12/7 8:59
     * @author: AllG
     * @param id
     * @return boolean
     */
    boolean existsById(ID id);

    /**
     * @method  findAll
     * @description 查询所有,慎用
     * @date: 2018/12/7 8:59
     * @author: AllG
     * @param
     * @return java.lang.Iterable<T>
     */
    Iterable<T> findAll(Optional<T> entity);

    /**
     * @method  findAllById
     * @description 通过多Id查询
     * @date: 2018/12/7 8:59
     * @author: AllG
     * @param ids
     * @return java.lang.Iterable<T>
     */
    Iterable<T> findAllById(Iterable<ID> ids);

    /**
     * @method  count
     * @description 计数
     * @date: 2018/12/7 9:00
     * @author: AllG
     * @param
     * @return long
     */
    long count(Optional<T> entity);

    /**
     * @method  deleteById
     * @description 通过Id删除
     * @date: 2018/12/7 9:01
     * @author: AllG
     * @param id
     * @return void
     */
    void deleteById(ID id);

    /**
     * @method  delete
     * @description 通过对象删除
     * @date: 2018/12/7 9:01
     * @author: AllG
     * @param entity
     * @return void
     */
    void delete(T entity);

    /**
     * @method  deleteAll
     * @description 删除多个对象
     * @date: 2018/12/7 9:01
     * @author: AllG
     * @param entities
     * @return void
     */
    void deleteAll(Iterable<? extends T> entities);

    /**
     * @method  findAll
     * @description 多条件分页动态查询，条件之间为合并关系
     * @date: 2018/12/7 9:04
     * @author: AllG
     * @param params
     * @param pageable
     * @return org.springframework.data.domain.Page<S>
     */
    <S extends T> Page<S> findAll(Map<String,String[]> params, Pageable pageable);
}
